#include <stdio.h>
//数据在内存中的存储
//1️⃣整数在内存中的存储————大小端字节序
//①设计一个小程序来判断当前机器的字节序。
int main()
{
    int a=1;          //00 00 00 01
    if(*((char*)&a))  
    printf("小端\n"); //01 00 00 00
    else
    printf("大端\n"); //00 00 00 01
    return 0;
}//输出:小端
//可以封装成一个函数
int check_sys()
{
    int a=1;
    return *((char*)&a);
}
int main()
{
    if(check_sys())
    printf("小端\n");
    else
    printf("大端\n");
    return 0;
}//输出:小端
//②P80  vscode 6.c
int main()
{
    char a = -1;//char是signed char还是unsigned char取决于编译器  P33
    //10000000000000000000000000000001（原码）
    //11111111111111111111111111111110（反码）
    //11111111111111111111111111111111（补码）
    //——>（截断）11111111 - a 
    signed char b = -1;
    //同理上面char
    //——>（截断）11111111 - b
    unsigned char c = -1;
    //10000000000000000000000000000001（原码）
    //11111111111111111111111111111110（反码）
    //11111111111111111111111111111111（补码）
    //——>（截断）11111111 - c
    printf("a=%d,b=%d,c=%d",a,b,c);
    //a ——>（整型提升）11111111111111111111111111111111（补码）
    //b ——>（整型提升）11111111111111111111111111111111（补码）
    //c ——>（整型提升）00000000000000000000000011111111（补码）原码为255
    return 0;
}//输出：a=-1,b=-1,c=255
//③
int main()
{
    char a = -128;
    //10000000000000000000000010000000
    //11111111111111111111111101111111
    //11111111111111111111111110000000
    //——>（截断）10000000 - a
    printf("%u\n",a);//4294967168
    //a ——>（整型提升）11111111111111111111111110000000（补码） 因为a是有符号的char类型，所以整型提升补符号位 P80
    //但是打印时%u是以十进制的形式打印无符号整数，那就会把已经整型提升的补码看作原码（无符号整数）
    //所以结果是4294967168
    return 0;
} 
int main()
{
    char a = 128;
    //00000000000000000000000010000000
    //——>（截断）10000000 - a
    printf("%u\n",a); //4294967168
    //a ——>（整型提升）11111111111111111111111110000000（补码） 因为a是有符号的char类型，所以整型提升补符号位
    return 0;
}
//④P105 轮回图  P106
#include <string.h>
int main()
{
    char a[1000];
    int i;
    for(i = 0; i < 1000; i++)
    {
        a[i] = -1 - i;
    }
    printf("%d",strlen(a));//255
    return 0;
}
//a[0]=-1 a[1]=-2 a[2]=-3 ……
//char类型范围是 -128~127
//当i=127时 a[127]=-128 当i=128时 a[128]=127
//-129 10000000000000000000000010000001 
//     11111111111111111111111101111110
//     11111111111111111111111101111111
//——>（截断）01111111  （127）
//当i=129时 a[129]=126  ……
//当i=255时 a[255]=0
//-256 10000000000000000000000100000000
//     11111111111111111111111011111111
//     11111111111111111111111100000000
//——>（截断）00000000  （0）
//strlen统计'\0'之前字符的个数，注意不要把a[255]=0算进去哦！
//⑤ 
unsigned char i = 0;   //无符号类型整型提升高位补0
//unsigned char类型范围0~255
int main()
{
    for(i = 0; i <= 255; i++)
    {
        printf("hello world\n");
    } 
    return 0;
}
//i=255  11111111
//i++后 100000000 ——> 00000000=0
//i<=255这个条件恒成立，所以程序一直死循环
int main()
{
    unsigned int i;//不可能小于0
    for(i = 9; i >= 0; i--)
    {
        printf("%u\n",i);
    }
    return 0;
}
//i=0  00000000000000000000000000000000
//i-- =11111111111111111111111111111111（一个很大的正数）
//i>=0这个条件恒成立，所以程序一直死循环
//⑥ P106
//X86环境 小端字节序
int main()
{
    int a[4] = { 1, 2, 3, 4 };
    int *ptr1 = (int *)(&a + 1);
    int *ptr2 = (int *)((int)a + 1);
    printf("%x,%x", ptr1[-1], *ptr2);//输出：4,2000000  （前面的0都省略了）
    //%x是以十六进制形式打印数据
    return 0;
}
//2️⃣浮点数在内存中的存储
//①可用vs2022 调试——内存 中查看
int main()
{
    int n=0;
    float *a=(float*)&n;
    *a=9.5f;
    //1001.1 ——>  1.0011*2^3
    //S=0   E=3   M=1.0011
//32位内存中存储：S=0  E=3+127=130（10000010） M=00110000000000000000000
//          0 10000010 00110000000000000000000
//十六进制：  41 18 00 00
    printf("%x",n);//输出：41180000
    return 0;
}
int main()
{
    int n=0;
    float *a=(float*)&n;
    *a=-9.5f;
    //1001.1 ——>  1.0011*2^3
    //S=1   E=3   M=1.0011
//32位内存中存储：S=1  E=3+127=130（10000010） M=00110000000000000000000
//          1 10000010 00110000000000000000000
//十六进制：  C1 18 00 00
    printf("%x",n);//输出：c1180000
    return 0;
}
//②
int main()
{
    int n = 9;
    float *pFloat = (float *)&n;
    printf("n的值为：%d\n", n);            //n的值为：9
    printf("*pFloat的值为：%f\n", *pFloat);//*pFloat的值为：0.000000
    //9:00000000000000000000000000001001
    //0 00000000 00000000000000000001001
    //S=0
    //E=0=1-127=-126  （全0） 
    //M=0.00000000000000000001001
    //(-1)^0*0.00000000000000000001001*2^(-126)
    *pFloat = 9.0;
    printf("n的值为：%d\n", n);            //n的值为：1091567616
    printf("*pFloat的值为：%f\n", *pFloat);//*pFloat的值为：9.000000
    //9.0   1001.0   (-1)^0*1.0010*2^3
    //S=0  E=3+127=130  M=1.0010
    //0 10000010 00100000000000000000000
    //==1,091,567,616
    return 0;
}
